package com.itheima.consumer.loadbanlace;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 轮询算法 ==> 实现
 * 利用原子计数器 + 服务列表取模方式
 * @作者 itcast
 * @创建日期 2020/11/8 15:39
 **/
@Component
public class MyLoadBanlanceRule {
    @Autowired
    DiscoveryClient discoveryClient;
    private AtomicInteger atomicInteger = new AtomicInteger(0);
    // 将计数器的值 + 1 并返回
    public int incrementAndGet(){
        int current;  // 记录当前计数器的值
        int next;  // 记录计数器+1之后的值
        do {
               //     获取int的值
            current = atomicInteger.get();
            next = current >= Integer.MAX_VALUE? 0 : current + 1 ;
               // 比较和替换:   current 读取到的值  next 要变更的值
               //      如果其它线程没修改 则修改成功 返回值为true 加非 循环结束
               //      如果其它线程修改  则修改失败 返回值为false 加非 为true继续尝试计数器+1
        }while (!atomicInteger.compareAndSet(current,next));
        return next;
    }
    public ServiceInstance chooseServer(String serviceId){
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
        if(instances == null || instances.isEmpty()){
            return null;
        }
        int size = instances.size();
        // 将计数器的值+1 并返回
        int num = incrementAndGet();
        int index = num % size;
        System.out.println("当前计数器的值==>" + atomicInteger.get() + " 服务列表的下标==>"+ index);
        return instances.get(index);
    }

}
